"""
@Project ：python
@File    ：08-类型注解.py
@IDE     ：PyCharm
@Author  ：DongCha
@Date    ：2024/4/10 010 19:46
"""
import json
import random
from typing import Union

# 变量的类型注解
# 帮助第三方IDE工具对代码进行类型推断，协助做代码提示
# 帮助开发者对自身变量进行注释
#
# 支持变量类型注解和函数形参列表以及返回值的类型注解

# 为变量设置类型注解
# 变量: 类型 = 值
# 为对象类设置类型注解
# class Person:
#     pass
# per: person = Person()
# 为容器设置简易类型注解
# my_list: list = [1, 2, 3]
# my_tuple: tuple = (1, 2, 3)
# 为容器设置详细类型注解
# my_list: list[int] = [1, 2, 3]
# my_tuple: tuple[str, int, bool] = ("a", 2, True)
# 元组类型设置详细注解必须将每一个元素都标记出来，字典类型设置详细注解，需要两个类型，第一个是key，第二个是value

var_1: int = 10
var_2: str = "DongCha"
var_3: bool = True


class Student:
    pass


stu: Student = Student()

my_list: list = [1, 2, 3]
my_tuple: tuple = (1, 2, 3)
my_dict: dict = {"name": "DongCha"}

my_list: list[int] = [1, 2, 3]
my_tuple: tuple[int, int, int] = (1, 2, 3)
my_dict: dict[str, str] = {"name": "DongCha"}

# 除了使用 变量: 类型 这种语法进行注解外，也可以在注释中进行类型注解：# type: 类型
var_4 = random.randint(1, 10)  # type: int
var_5 = json.loads('{"name": "DongCha"}')  # type: dict[str, str]
def func():
    return 10
var_6 = func()  # type: int

# 类型注解仅仅是提示性的，而不是决定性的
var_7: int = "DongCha"
var_8: str = 23

# 函数（方法）的类型注解
# 对形参进行类型注解
def add(x: int, y: int):
    return x+y

# 对返回值进行类型注解
def func(data: list) -> list:
    return data

# Union类型
my_list: list[Union[int, str]] = [1, 2, "3", "4"]
my_dict: dict[str, Union[int, str]] = {"name": "DongCha", "age": 22}
# 使用 Union[类型, 类型……] 可以定义联合类型注解
def func2(data: Union[int, list]) -> Union[int, list]:
    return data
